#pragma once

#include <string>
#include <regex>
#include <unordered_map>

class HttpRequest
{
public:
    std::string _method;                                   // 请求方法
    std::string _path;                                     // 请求路径
    std::string _version;                                  // 协议版本
    std::string _body;                                     // 请求正文
    std::smatch _matches;                                  // 资源路径的正则提取数据
    std::unordered_map<std::string, std::string> _headers; // 头部字段
    std::unordered_map<std::string, std::string> _params;  // 查询字符串

public:
    HttpRequest();

    // 1. 重置当前请求
    void ReSet();

    // 2. 插入头部字段
    void SetHeader(const std::string &key, const std::string &val);

    // 3. 判断是否存在指定头部字段
    bool HasHeader(const std::string &key);

    // 4. 获取指定头部字段
    std::string GetHeader(const std::string &key) const;

    // 5. 插入查询字符串
    void SetParam(std::string &key, std::string &val);

    // 6. 判断是否有某个指定的查询字符串
    bool HasParam(std::string &key);

    // 7. 获取指定的查询字符串
    std::string GetParam(std::string &key);

    // 8. 获取正文长度
    size_t ContentLength();

    // 9. 判断当前请求是否是短连接
    bool Close() const;
};